package com.hyts.bmsp.controller;

import java.lang.reflect.Field;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.jfinal.core.Controller;
import com.jfinal.upload.UploadFile;

/**
 * @ClassName: BaseController
 * @Description: 系统信息基础控制器操作</br>
 * 				  用于封装和解析提供给开发人员</br>
 * 				 Servlet容器中所需要的参数信息</br>
 * 				 Controller 是 JFinal 核心类之一，该类作为 MVC 模式中的控制器。基于 JFinal 的 Web 应</br>
				   用的控制器需要继承该类。Controller 是定义 Action 方法的地点，是组织 Action 的一种方式，</br>
				   一个 Controller 可以包含多个 Action。Controller 是线程安全的。</br>
 * @author: 李博/Alex
 * @date: 2017-1-7 下午04:49:15
 */

public abstract class WebController extends Controller{

	
	/***************************获取HttpServlet对象中的Request|Response********************************************/
	/**
	 * @Title: getHttpServletRequest
	 * @Description: 获取HttpServletRequest对象
	 * @return
	 * @return: HttpServletRequest
	 */
	public HttpServletRequest getHttpServletRequest(){return super.getRequest();}
	
	/**
	 * @Title: getHttpServletResponse
	 * @Description: 获取HttpServletResponse对象
	 * @return
	 * @return: HttpServletResponse
	 */
	public HttpServletResponse getHttpServletResponse(){return super.getResponse();}
	
	/**
	 * @Title: getHttpSession
	 * @Description: 获取HttpSession
	 * @return
	 * @return: HttpSession
	 */
	public HttpSession getHttpSession(){return super.getSession();}
	
	/**
	 * @Title: getHttpSession
	 * @Description: 获取HttpSession 带有是否创建的标志
	 * @param createFlag
	 * @return
	 * @return: HttpSession
	 */
	public HttpSession getHttpSession(boolean createFlag){ return super.getSession(createFlag);}
	
	
	
	/***************************获取HttpServlet对象中的参数|Parameter信息********************************************/
	/**
	 * @Title: getHttpSessionParameter
	 * @Description: 获取Session中对应key中的Value信息
	 * @param attributeName
	 * @return
	 * @return: HttpSession
	 */
	public HttpSession getHttpSessionParameter(String attributeName){ return super.getSessionAttr(attributeName);}

	/**
	 * @Title: getParameters
	 * @Description: 获取参数信息数据值：无默认值
	 * @return
	 * @return: String
	 */
	public String getParameters(){return super.getPara();}

	/**
	 * @Title: getParameter
	 * @Description: 获取参数信息数据值：无默认值
	 * @param index
	 * @return
	 * @return: String
	 */
	public String getParameter(int index){return super.getPara(index);}
	
	/**
	 * @Title: getParemeter
	 * @Description: 获取参数信息数据值：无默认值
	 * @param parameterName
	 * @return
	 * @return: String
	 */
	public String getParemeter(String parameterName){return super.getPara(parameterName);}
	
	/**
	 * @Title: getParameter
	 * @Description: 获取参数信息数据值：有默认值
	 * @param index
	 * @param defaultValue
	 * @return
	 * @return: String
	 */
	public String getParameter(int index,String defaultValue){return super.getPara(index,defaultValue);}
	
	/**
	 * @Title: getParemeter
	 * @Description: 获取参数信息数据值：有默认值
	 * @param parameterName
	 * @param defaultValue
	 * @return
	 * @return: String
	 */
	public String getParameter(String parameterName,String defaultValue){return super.getPara(parameterName,defaultValue);}

	/**
	 * @Title: getParameter
	 * @Description: 获取参数信息数据值
	 * @param parameterName
	 * @return
	 * @return: String
	 */
	public String getParameter(String parameterName){return super.getPara(parameterName);}
	
	/**
	 * @Title: getParemeterMap
	 * @Description: 获取参数信息数据值Map集合
	 * @return
	 * @return: Map<String,String[]>
	 */
	public Map<String,String[]> getParemeterMap(){return super.getParaMap();}
	
	/***************************获取HttpServlet对象中的参数getModel()方法获取对应的Model-Java Bean对象信息********************************************/

	/**
	 * @Title: getJavaBean
	 * @Description: 根据对于不同的ModelJavaBean信息对象数据<br>
	 * 				   获取不同的对象
	 * @param <T>
	 * @param t
	 * @return
	 * @return: T
	 */
	public <T> T getJavaBean(T t){ return (T) super.getModel(t.getClass());}
	
	/**
	 * @Title: getJavaBean
	 * @Description: 根据对于不同的ModelJavaBean信息对象数据<br>
	 * 				   获取不同的对象，根据不同的ModelName
	 * @param <T>
	 * @param t
	 * @param modelName
	 * @return
	 * @return: T
	 */
	public <T> T getJavaBean(T t,String modelName){ return (T) super.getModel(t.getClass(),modelName);}
	
	/***************************获取HttpServlet对象中的参数getFile  文件上传对象信息********************************************/
	
	/**
	 * Controller 提供了 getFile 系列方法支持文件上传。 特别注意：如果客户端请求为 multipart<br>
	   request（form 表单使用了 enctype="multipart/form-data"） ，那么必须先调用 getFile 系列方法才<br>
	       能使 getPara 系列方法正常工作， 因为 multipart request 需要通过 getFile 系列方法解析请求体中<br>
	       的数据，包括参数。<br>
	 */
	
	/**
	 * @Title: getUploadFile
	 * @Description: 获取上传文件
	 * @return
	 * @return: UploadFile
	 */
	public UploadFile getUploadFile(){ return super.getFile();}
	
	/**
	 * @Title: getUploadFile
	 * @Description: 获取上传文件根据参数名称
	 * @param paramName
	 * @return
	 * @return: UploadFile
	 */
	public UploadFile getUploadFile(String paramName){ return super.getFile(paramName);}
	
	/**
	 * @Title: getUploadFile
	 * @Description: 获取上传文件根据参数
	 * @param paramName
	 * @param uploadFilePath
	 * @param maxFileSize
	 * @return
	 * @return: UploadFile
	 */
	public UploadFile getUploadFile(String paramName,String uploadFilePath,Integer maxFileSize){ return super.getFile(paramName, uploadFilePath, maxFileSize);}

	/**
	 * @Title: getUploadFile
	 * @Description: 获取上传文件根据参数
	 * @param paramName
	 * @param uploadFilePath
	 * @return
	 * @return: UploadFile
	 */
	public UploadFile getUploadFile(String paramName,String uploadFilePath){ return super.getFile(paramName, uploadFilePath);}

	/**
	 * @Title: getUploadFile
	 * @Description: 获取上传文件根据参数
	 * @param paramName
	 * @param uploadFilePath
	 * @param maxFileSize
	 * @param encode
	 * @return
	 * @return: UploadFile
	 */
	public UploadFile getUploadFile(String paramName,String uploadFilePath,Integer maxFileSize,String encode){ return super.getFile(paramName, uploadFilePath, maxFileSize, encode);}

	
	/***************************获取HttpServlet对象进行控制信息转发操作********************************************/

	/**
	 * @Title: dispatcherAction
	 * @Description: 转发操作跳转信息Action控制器
	 * @param actionUrl
	 * @return: void
	 */
	public void dispatcherAction(String actionUrl){ super.forwardAction(actionUrl);}
	
	/**
	 * @Title: redirectAction
	 * @Description: 重定向操作
	 * @param actionUrl
	 * @return: void
	 */
	public void redirectAction(String actionUrl){ super.redirect(actionUrl);}

	/***************************获取HttpServlet对象进行Set方法控制注入参数信息********************************************/

	/**
	 * @Title: setAttribute
	 * @Description: setAttribute参数信息
	 * @param key
	 * @param value
	 * @return: Controller
	 */
	public Controller setAttribute(String key,Object value){ return super.setAttr(key, value);}
	
	/**
	 * @Title: setAttributes
	 * @Description: setAttributes参数信息
	 * @param attributes
	 * @return
	 * @return: Controller
	 */
	public Controller setAttributes(Map<String,Object> attributes){return super.setAttrs(attributes);}

	/***************************获取HttpServlet对象进行SetSession方法控制注入参数信息********************************************/

	/**
	 * @Title: removeAttribute
	 * @Description: 删除Session级别的属性
	 * @param attribute
	 * @return
	 * @return: Controller
	 */
	public Controller removeAttribute(String attribute){ return super.removeSessionAttr(attribute);}
	
	/**
	 * @Title: setSessionAttribute
	 * @Description: setSessionAttributes参数信息
	 * @param key
	 * @param value
	 * @return
	 * @return: Controller
	 */
	public Controller setSessionAttribute(String key,Object value){return super.setSessionAttr(key, value);}
	
	/***************************render 系列********************************************/
	
	/**
	 * 注意：
		1：IE 不支持 contentType 为 application/json,在 ajax 上传文件完成后返回 json 时 IE 提示下载文<br>
		       件 , 解 决 办 法 是 使 用 ： render(new  JsonRender().forIE()) 或 者 render(new<br>
		   JsonRender(params).forIE())。这种情况只出现在 IE 浏览器 ajax 文件上传，其它普通 ajax 请求<br>
		      不必理会。<br>
	    2：除 renderError 方法以外，在调用 render 系列的方法后程序并不会立即返回，如果需要立即<br>
		      返回需要使用 return 语句。在一个 action 中多次调用 render 方法只有最后一次有效。<br>
	 */
	
	/**
	 * @Title: toView
	 * @Description: 跳转配置的对应类型的视图
	 * @param viewPath
	 * @param status
	 * @return: void
	 */
	public void toView(String viewPath,int status){ super.render(viewPath,status);}
	
	/**
	 * @Title: toView
	 * @Description: 跳转配置的对应类型的视图
	 * @param viewPath
	 * @return: void
	 */
	public void toView(String viewPath){super.render(viewPath);}
	/**
	 * @Title: toJsp
	 * @Description: 跳转到Jsp页面的视图
	 * @param jspPath
	 * @return: void
	 */
	public void toJsp(String jspPath){ super.renderJsp(jspPath+".jsp");}
	
	/**
	 * @Title: toVelocity
	 * @Description: 跳转到Velocity页面的视图
	 * @param velocityPath
	 * @return: void
	 */
	public void toVelocity(String velocityPath){ super.renderVelocity(velocityPath);}
	
	/**
	 * @Title: toJson
	 * @Description: 跳转到Json字符串信息<br>
	 * 				  将所有通过 Controller.setAttr(String, Object)设置<br>
					  的变量转换成 json 数据并渲染。<br>
	 * @return: void
	 */
	public void toJson(){ super.renderJson();}

	/**
	 * @Title: toJson
	 * @Description: 跳转到Json字符串信息<br>
	 * 				   直接渲染 json字符串。
	 * @param jsonStr
	 * @return: void
	 */
	public void toJson(String jsonStr){ super.renderJson(jsonStr);}
	
	/**
	 * @Title: toJson
	 * @Description: 跳转到Json字符串信息<br>
	 * 				  仅将 setAttr(“user”, user)与 setAttr(“blog”, blog)设<br>
					  置的属性转换成 json 并渲染。使用 setAttr 设置的<br>
				   	  其它属性并不转换为 json。<br>
	 * @param jsonStrs
	 * @return: void
	 */
	public void toJson(String[] jsonStrs){ super.renderJson(jsonStrs);}

	/**
	 * @Title: toJson
	 * @Description: 跳转到Json字符串信息<br>
	 * 			             将 object 对象转换成 json 数据并渲染
	 * @param object
	 * @return: void
	 */
	public void toJson(Object object){ super.renderJson(object);}

	/**
	 * @Title: toJson
	 * @Description: 跳转到Json字符串信息<br>
	 * 				  以”key”为根，仅将 value中的数据转换成 json<br>
					  数据并渲染。
	 * @param key
	 * @param value
	 * @return: void
	 */
	public void toJson(String key,Object value){ super.renderJson(key,value);}

	/**
	 * @Title: toText
	 * @Description: 渲染纯文本内容
	 * @param text
	 * @return: void
	 */
	public void toText(String text){ super.renderText(text);}
	
	/**
	 * @Title: toText
	 * @Description: 渲染纯文本内容
	 * @param text
	 * @param contentType
	 * @return: void
	 */
	public void toText(String text,String contentType){super.renderText(text, contentType);}

	/**
	 * @Title: toFile
	 * @Description: 渲染名为 test.zip 的文件，一般用于文件下载
	 * @param filePath
	 * @return: void
	 */
	public void toFile(String filePath){ super.renderFile(filePath);}
	
	/**
	 * @Title: toCancel
	 * @Description: 不进行返回任何数据信息
	 * @return: void
	 */
	public void toCancel(){ super.renderNull();}
	
	/**
	 * @Title: toError
	 * @Description: 立即返回:错误
	 * @param code
	 * @return
	 * @return: Controller
	 */
	public void toError(Integer code){ super.renderError(code);return;}
	
	/**
	 * @Title: toError
	 * @Description: 立即返回:错误
	 * @param code
	 * @param view
	 * @return: void
	 */
	public void toError(Integer code,String view){ super.renderError(code,view);return;}

}
